﻿using System.Runtime.InteropServices;

namespace System.NETool;

/// <summary>
/// 提供系统相关的扩展方法。
/// </summary>
public static class SystemEx
{
    /// <summary>
    /// 判断当前操作系统是否为 Linux。
    /// </summary>
    /// <returns>如果当前操作系统为 Linux，则返回 true；否则返回 false。</returns>
    public static bool IsLinux() => RuntimeInformation.IsOSPlatform(OSPlatform.Linux);

    /// <summary>
    /// 判断当前操作系统是否为 Windows。
    /// </summary>
    /// <returns>如果当前操作系统为 Windows，则返回 true；否则返回 false。</returns>
    public static bool IsWindows() => RuntimeInformation.IsOSPlatform(OSPlatform.Windows);

    /// <summary>
    /// 判断当前操作系统是否为 macOS。
    /// </summary>
    /// <returns>如果当前操作系统为 macOS，则返回 true；否则返回 false。</returns>
    public static bool IsMacOS() => RuntimeInformation.IsOSPlatform(OSPlatform.OSX);

    /// <summary>
    /// 用于阻塞线程的事件等待句柄。
    /// </summary>
    internal static EventWaitHandle EwHandle;

    /// <summary>
    /// 阻塞当前线程，直到收到信号。
    /// </summary>
    public static void WaitOne()
    {
        // 初始化事件等待句柄，手动重置模式
        EwHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
        // 阻塞当前线程，直到收到信号
        EwHandle.WaitOne();
    }

    /// <summary>
    /// 发送信号以释放阻塞的线程。
    /// </summary>
    public static void Set()
    {
        // 发送信号，释放阻塞的线程
        EwHandle.Set();
    }

    /// <summary>
    /// 微秒延时
    /// </summary>
    /// <param name="microseconds">微秒</param>
    public static void USleep(int microseconds) => NSleep(microseconds * 1000);

    /// <summary>
    /// 纳秒延时
    /// </summary>
    /// <param name="nanoseconds">纳秒</param>
    public static void NSleep(int nanoseconds)
    {
        var dt = DateTime.Now;
        while ((DateTime.Now - dt).TotalNanoseconds < nanoseconds)
        {
            // 空循环，直到达到目标延迟时间
            // 注意：这种方法会占用 CPU 资源
            //Thread.Sleep(0);
            Thread.SpinWait(0);
        }
    }
}

